#pragma warning (push)
#pragma warning (disable: 4189)

#if BLT_SIZE == 3
static void __declspec(noinline) BLT_NAME(uint w, uint h, byte * src, byte * dst, int srcpitch, int dstpitch)
{
    byte* src2 = src;
    byte* dst2 = dst;
    // uint* src2_32 = (uint*)src;
    // uint* dst2_32 = (uint*)dst;
    uint y, x, ww, xxd;
    #ifdef BLT_TEMP
    uint tmp;
    #endif
    w *= BLT_SIZE;
    ww = w / 4;
    xxd = w - (ww * 4);
    for (y = 0; y < h; y++)
    {
        byte* src_8;
        byte* dst_8;
        uint* src_32 = (uint*)src2;
        uint* dst_32 = (uint*)dst2;
        for (x = 0; x < ww; x++)
        {
            BLT_FUNC(src_32, dst_32);
            src_32++;
            dst_32++;
        }
        src_8 = (byte*)src_32;
        dst_8 = (byte*)dst_32;
        for (x = 0; x < xxd; x++)
        {
            BLT_FUNC(src_8, dst_8);
            src_8++;
            dst_8++;
        }
        dst2 += dstpitch;
        src2 += srcpitch;
    }
}
#else
static void __declspec(noinline) BLT_NAME(uint w, uint h, byte * src, byte * dst, int srcpitch, int dstpitch)
{
    byte* src2 = src;
    byte* dst2 = dst;
    // uint* src2_32 = (uint*)src;
    // uint* dst2_32 = (uint*)dst;
    uint y, x, ww, xxd;
    #ifdef BLT_TEMP
    #if BLT_SIZE == 4
    uint tmp;
    #elif BLT_SIZE == 2
    ushort tmp;
    #else
    byte tmp;
    #endif
    #endif

    if (w < 8 * BLT_MULT)
    {
        ww = w / BLT_MULT;
        for (y = 0; y < h; y++)
        {
            uint* src_32 = (uint*)src2;
            uint* dst_32 = (uint*)dst2;
            for (x = 0; x < ww; x++)
            {
                BLT_FUNC(src_32, dst_32);
                src_32++;
                dst_32++;
            }
            #if BLT_SIZE == 2
            if (w & 1)
            {
                ushort* src_16 = (ushort*)src_32;
                ushort* dst_16 = (ushort*)dst_32;
                BLT_FUNC(src_16, dst_16);
            }
            #elif BLT_SIZE == 1
            {
                int wb = w & 3;
                byte* src_8 = (byte*)src_32;
                byte* dst_8 = (byte*)dst_32;
                while (wb--)
                {
                    BLT_FUNC(src_8, dst_8);
                    src_8++;
                    dst_8++;
                }
            }
            #endif
            dst2 += dstpitch;
            src2 += srcpitch;
        }
        return;
    }

    ww = w / (8 * BLT_MULT);
    xxd = (w - ww * (8 * BLT_MULT)) / BLT_MULT;
    for (y = 0; y < h; y++)
    {
        uint* src_32 = (uint*)src2;
        uint* dst_32 = (uint*)dst2;
        for (x = 0; x < ww; x++)
        {
            BLT_FUNC(src_32, dst_32);
            src_32++;
            dst_32++;
            BLT_FUNC(src_32, dst_32);
            src_32++;
            dst_32++;
            BLT_FUNC(src_32, dst_32);
            src_32++;
            dst_32++;
            BLT_FUNC(src_32, dst_32);
            src_32++;
            dst_32++;
            BLT_FUNC(src_32, dst_32);
            src_32++;
            dst_32++;
            BLT_FUNC(src_32, dst_32);
            src_32++;
            dst_32++;
            BLT_FUNC(src_32, dst_32);
            src_32++;
            dst_32++;
            BLT_FUNC(src_32, dst_32);
            src_32++;
            dst_32++;
        }
        for (x = 0; x < xxd; x++)
        {
            BLT_FUNC(src_32, dst_32);
            src_32++;
            dst_32++;
        }
        #if BLT_SIZE == 2
        if (w & 1)
        {
            ushort* src_16 = (ushort*)src_32;
            ushort* dst_16 = (ushort*)dst_32;
            BLT_FUNC(src_16, dst_16);
        }
        #elif BLT_SIZE == 1
        {
            int wb = w & 3;
            byte* src_8 = (byte*)src_32;
            byte* dst_8 = (byte*)dst_32;
            while (wb--)
            {
                BLT_FUNC(src_8, dst_8);
                src_8++;
                dst_8++;
            }
        }
        #endif
        dst2 += dstpitch;
        src2 += srcpitch;
    }
}
#endif
#undef BLT_NAME
#undef BLT_FUNC
#ifdef BLT_TEMP
    #undef BLT_TEMP
#endif

#pragma warning (pop)